///**
// * 
// */
//package com.concurrent.execute.threadPool;
//
//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.Callable;
//import java.util.concurrent.RejectedExecutionHandler;
//import java.util.concurrent.RunnableFuture;
//import java.util.concurrent.ThreadFactory;
//import java.util.concurrent.ThreadPoolExecutor;
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.atomic.AtomicInteger;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.concurrent.execute.AsExecuteResult;
//
///**
// * 原始的java线程池是没有最大线程，最小线程区分的，在queue满之前，都是采用corePoolSize数量的线程运行，queue满之后会增加线程，
// * 直到maximunPoolSize数量的线程，因此提供哦功能动态线程池，动态的增加，减少线程数量。
// * 
// * @author liaokucheng
// * @date 2016年11月10日
// * 
// */
//public class DynamicThreadPool extends ThreadPoolExecutor {
//
//	private static Logger log = LoggerFactory.getLogger(DynamicThreadPool.class);
//	/**
//	 * 最小线程
//	 */
//	private volatile int minThreadSize = 1;
//	/**
//	 * 最大线程
//	 */
//	private volatile int maxThreadSize;
//	/**
//	 * 当前系统线程数
//	 */
//	private volatile AtomicInteger currentThreadSize;
//	/**
//	 * 执行任务的数量
//	 */
//	private AtomicInteger taskNum;
//
//	public DynamicThreadPool(int minThreadSize, int maxThreadSize, long keepAliveTime, TimeUnit unit,
//			BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
//
//		super(1, maxThreadSize, keepAliveTime, unit, workQueue, threadFactory, handler);
//		this.maxThreadSize = maxThreadSize;
//		this.currentThreadSize = new AtomicInteger(1);
//		this.taskNum = new AtomicInteger(0);
//	}
//
//	@Override
//	public void execute(Runnable command) {
//
//		dynamicIncreate();
//		super.execute(new ExceptionCatchRunnable(command, this));
//	}
//
//	/**
//	 * 完成任务时,改变线程数
//	 */
//	private void taskCompleted() {
//		int taskN = taskNum.decrementAndGet();
//		if (currentThreadSize.get() > taskN + 1) {
//			System.out.println(taskN+"  --   "+currentThreadSize.get());
//			// 当前线程数大于任务数量。
//			//
//			int threadNum = currentThreadSize.decrementAndGet();
//			if (threadNum >= minThreadSize) {
//				setCorePoolSize(threadNum);
//			}
//		}
//	}
//
//	/**
//	 * 动态增长
//	 */
//	private void dynamicIncreate() {
//		int taskN = taskNum.incrementAndGet();
//		int threadNum = currentThreadSize.get();
//		// 当前任务数量超过线程数据，并且线程数量没有到达最大线程数，增加线程数量
//		if (threadNum < maxThreadSize && taskN > threadNum) {
//			// 任务数量超过最小线程数量，有任务正在排队,增加corePoolSize
//			setCorePoolSize(currentThreadSize.incrementAndGet());
//
//		}
//
//	}
//
//	@Override
//	protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
//
//		return new AsExecuteResult<T>(runnable, value);
//	}
//
//	@Override
//	protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
//
//		return new AsExecuteResult<T>(callable);
//	}
//
//	/**
//	 * 处理异常
//	 * 
//	 * @author kucheng.liao@weaver.com.cn
//	 * @Date 2017年3月27日
//	 * 
//	 */
//	private static class ExceptionCatchRunnable implements Runnable {
//
//		private Runnable runnable;
//
//		private DynamicThreadPool threadPool;
//
//		private ExceptionCatchRunnable(Runnable runnable, DynamicThreadPool threadPool) {
//
//			this.runnable = runnable;
//			this.threadPool = threadPool;
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see java.lang.Runnable#run()
//		 */
//		@Override
//		public void run() {
//
//			try {
//				runnable.run();
//			} catch (Exception e) {
//				log.error("", e);
//			} finally {
//				if (null != threadPool) {
//					threadPool.taskCompleted();
//				}
//			}
//
//		}
//	}
//
//}
